package br.com.projeto.persistence;

import java.util.ArrayList;
import java.util.List;

import br.com.projeto.entity.EnderecoVO;
import br.com.projeto.entity.UsuarioFisicoVO;
import br.com.projeto.entity.UsuarioJuridicoVO;
import br.com.projeto.entity.UsuarioVO;

import com.acol.util.IntegerUtils;
import com.acol.util.StringUtil;

public class UsuarioDAO extends BaseDAO {
	
	public void inserirUsuario(UsuarioVO usuarioVO) throws Exception{
		open();
		stmt = con.prepareStatement("INSERT INTO usuario(seq_usuario,login,senha,email,tipo_usuario,tipo_acesso)" +
									"VALUES(null,upper(?),upper(?),upper(?),upper(?),upper(?))");
        stmt.setString(1, usuarioVO.getLogin());
        stmt.setString(2, usuarioVO.getSenha());
        stmt.setString(3, usuarioVO.getEmail());
        stmt.setString(4, usuarioVO.getTipoUsuario());
        stmt.setString(5, usuarioVO.getTipoAcesso());
        stmt.executeUpdate();
        stmt.close();
        close();
	}
	
	public void inserirUsuarioFisico(UsuarioFisicoVO usuarioFisicoVO) throws Exception{
		open();
		stmt = con.prepareStatement("INSERT INTO usuario_fisico(seq_usuario,cpf,nome)" +
									"VALUES(upper(?),upper(?),upper(?))");
		
        stmt.setInt(1, usuarioFisicoVO.getSeqUsuario());
        stmt.setString(2, usuarioFisicoVO.getCpf());
        stmt.setString(3, usuarioFisicoVO.getNome());
        stmt.executeUpdate();
        stmt.close();
        close();
	}
	
	public void inserirUsuarioJuridico(UsuarioJuridicoVO usuarioJuridicoVO) throws Exception{
		open();
		stmt = con.prepareStatement("INSERT INTO usuario_juridico(seq_usuario,razao_social,inscricao_estadual,cnpj)" +
									"VALUES(upper(?),upper(?),upper(?),upper(?))");
        stmt.setInt(1, usuarioJuridicoVO.getSeqUsuario());
        stmt.setString(2, usuarioJuridicoVO.getRazaoSocial());
        stmt.setString(3, usuarioJuridicoVO.getInscricaoEstadual());
        stmt.setString(4, usuarioJuridicoVO.getCnpj());
        stmt.executeUpdate();
        stmt.close();
        close();
	}
	
	public void alterarUsuario(UsuarioVO usuarioVO) throws Exception{
		open();
		stmt = con.prepareStatement("UPDATE usuario " +
									"SET 	login = upper(?)," +
									"	 	senha = upper(?)," +
									"		email = upper(?)," +
									"		tipo_usuario = upper(?)," +
									"		tipo_acesso = upper(?)" +
									"WHERE 	seq_usuario = ?");
        stmt.setString(1, usuarioVO.getLogin());
        stmt.setString(2, usuarioVO.getSenha());
        stmt.setString(3, usuarioVO.getEmail());
        stmt.setString(4, usuarioVO.getTipoUsuario());
        stmt.setString(5, usuarioVO.getTipoAcesso());
        stmt.setInt(6, usuarioVO.getSeqUsuario());
        stmt.execute();
        stmt.close();
        close();
	}
	
	public void alterarUsuarioFisico(UsuarioFisicoVO usuarioFisicoVO) throws Exception{
		open();
		stmt = con.prepareStatement("UPDATE usuario_fisico " +
									"SET 	cpf = upper(?)," +
									"	 	nome = upper(?)" +
									"WHERE 	seq_usuario = ?");
        stmt.setString(1, usuarioFisicoVO.getCpf());
        stmt.setString(2, usuarioFisicoVO.getNome());
        stmt.setInt(3, usuarioFisicoVO.getSeqUsuario());
        stmt.execute();
        stmt.close();
        close();
	}
	
	public void alterarUsuarioJuridico(UsuarioJuridicoVO usuarioJuridicoVO) throws Exception{
		open();
		stmt = con.prepareStatement("UPDATE usuario_juridico " +
									"SET 	razao_social = upper(?)," +
									"	 	inscricao_estadual = upper(?)," +
									"		cnpj = upper(?)" +
									"WHERE 	seq_usuario = ?");
        stmt.setString(1, usuarioJuridicoVO.getRazaoSocial());
        stmt.setString(2, usuarioJuridicoVO.getInscricaoEstadual());
        stmt.setString(3, usuarioJuridicoVO.getCnpj());
        stmt.setInt(4, usuarioJuridicoVO.getSeqUsuario());
        stmt.execute();
        stmt.close();
        close();
	}
	
	public void deletarUsuario(UsuarioVO usuarioVO) throws Exception{
		open();
		stmt = con.prepareStatement("DELETE FROM usuario WHERE 	seq_usuario = "+usuarioVO.getSeqUsuario());
        stmt.execute();
        stmt.close();
        close();
	}

    public List<UsuarioVO> buscarTodosUsuario() throws Exception{
    	open();
		stmt = con.prepareStatement("SELECT 	u.seq_usuario, " +
									"			u.login, " +
									"			u.senha, " +
									"			u.email, " +
									"			u.tipo_usuario, " +
									"			u.tipo_acesso, " +
									"			uf.cpf, " +
									"			uf.nome, " +
									"			uj.cnpj, " +
									"			uj.razao_social, " +
									"			uj.inscricao_estadual,  " +
									"			e.logradouro, " +
									"			e.numero, " +
									"			e.complemento, " +
									"			e.bairro, " +
									"			e.cidade, " +
									"			e.estado, " +
									"			e.cep, " +
									"			e.tel_comercial, " +
									"			e.tel_residencial, " +
									"			e.tel_celular" +
									"FROM	usuario u  " +
									"LEFT JOIN usuario_fisico uf ON (u.seq_usuario = uf.seq_usuario)  " +
									"LEFT JOIN usuario_juridico uj ON (u.seq_usuario = uj.seq_usuario)" +
									"LEFT JOIN endereco e ON (u.seq_usuario = e.seq_usuario)");
        rs = stmt.executeQuery();
        List<UsuarioVO> lista = new ArrayList<UsuarioVO>();
        while(rs.next()){
        	UsuarioVO usuario = new UsuarioVO();
        	usuario.setSeqUsuario(Integer.valueOf(rs.getString("seq_usuario")));
        	usuario.setLogin(rs.getString("login"));
        	usuario.setSenha(rs.getString("senha"));
        	usuario.setEmail(rs.getString("email"));
        	usuario.setTipoUsuario(rs.getString("tipo_usuario"));
        	usuario.setTipoAcesso(rs.getString("tipo_acesso"));
        	if(usuario.getTipoUsuario().equals("1")){
        		usuario.setUsuarioFisicoVO(new UsuarioFisicoVO());
        		usuario.getUsuarioFisicoVO().setCpf(rs.getString("cpf"));
        		usuario.getUsuarioFisicoVO().setNome(rs.getString("nome"));
        		usuario.getUsuarioFisicoVO().setSeqUsuario(usuario.getSeqUsuario());
        	}else if(usuario.getTipoUsuario().equals("2")){
        		usuario.setUsuarioJuridicoVO(new UsuarioJuridicoVO());
        		usuario.getUsuarioJuridicoVO().setCnpj(rs.getString("cnpj"));
        		usuario.getUsuarioJuridicoVO().setInscricaoEstadual(rs.getString("inscricao_estadual"));
        		usuario.getUsuarioJuridicoVO().setRazaoSocial(rs.getString("razao_social"));
        		usuario.getUsuarioJuridicoVO().setSeqUsuario(usuario.getSeqUsuario());
        	}
        	usuario.setEnderecoVO(new EnderecoVO());
        	usuario.getEnderecoVO().setBairro(rs.getString("bairro"));
        	usuario.getEnderecoVO().setCep(rs.getString("cep"));
        	usuario.getEnderecoVO().setCidade(rs.getString("cidade"));
        	usuario.getEnderecoVO().setComplemento(rs.getString("complemento"));
        	usuario.getEnderecoVO().setEstado(rs.getString("estado"));
        	usuario.getEnderecoVO().setLogradouro(rs.getString("logradouro"));
        	usuario.getEnderecoVO().setNumero(rs.getString("numero"));
        	usuario.getEnderecoVO().setTelCelular(rs.getString("tel_celular"));
        	usuario.getEnderecoVO().setTelComercial(rs.getString("tel_comercial"));
        	usuario.getEnderecoVO().setTelResidencial(rs.getString("tel_residencial"));
        	usuario.getEnderecoVO().setSeqEndereco(usuario.getSeqUsuario());
        	lista.add(usuario);
        }
        stmt.close();
        close();
        return lista;
    }
    
    public UsuarioVO buscarUsuario(UsuarioVO usuarioVO) throws Exception{
    	StringBuffer sql = new StringBuffer();
    	sql.append(" SELECT 	u.seq_usuario, \n" );
    	sql.append("			u.login, \n" );
    	sql.append("			u.senha, \n" );
    	sql.append("			u.email, \n" );
    	sql.append("			u.tipo_usuario, \n" );
    	sql.append("			u.tipo_acesso, \n" );
    	sql.append("			uf.cpf, \n" );
    	sql.append("			uf.nome, \n" );
    	sql.append("			uj.cnpj, \n" );
    	sql.append("			uj.razao_social, \n" );
    	sql.append("			uj.inscricao_estadual,  \n" );
    	sql.append("			e.logradouro, \n" );
    	sql.append("			e.numero, \n" );
    	sql.append("			e.complemento, \n" );
    	sql.append("			e.bairro, \n" );
    	sql.append("			e.cidade, \n" );
    	sql.append("			e.estado, \n" );
    	sql.append("			e.cep, \n" );
    	sql.append("			e.tel_comercial, \n" );
    	sql.append("			e.tel_residencial, \n" );
    	sql.append("			e.tel_celular \n" );
    	sql.append(" FROM	usuario u  \n" );
    	sql.append(" LEFT JOIN usuario_fisico uf ON (u.seq_usuario = uf.seq_usuario)  \n" );
    	sql.append(" LEFT JOIN usuario_juridico uj ON (u.seq_usuario = uj.seq_usuario) \n" );
    	sql.append(" LEFT JOIN endereco e ON (u.seq_usuario = e.seq_usuario) \n" );
    	sql.append(" WHERE 1=1 ");
    	if(!IntegerUtils.empty(usuarioVO.getSeqUsuario())){
    		sql.append("\n AND u.seq_usuario ="+usuarioVO.getSeqUsuario());
 		}
    	if(!StringUtil.empty(usuarioVO.getLogin()) && !StringUtil.empty(usuarioVO.getSenha())){
    		sql.append("\n AND u.login like upper('"+usuarioVO.getLogin()+"')");
    		sql.append("\n AND u.senha like upper('"+usuarioVO.getSenha()+"')");
    	}
     	open();
     	stmt = con.prepareStatement(sql.toString());
			rs = stmt.executeQuery();
			UsuarioVO usuario = null;
			if(rs.next()){
				usuario = new UsuarioVO();
				usuario.setSeqUsuario(Integer.valueOf(rs.getString("seq_usuario")));
				usuario.setLogin(rs.getString("login"));
				usuario.setSenha(rs.getString("senha"));
				usuario.setEmail(rs.getString("email"));
				usuario.setTipoUsuario(rs.getString("tipo_usuario"));
				usuario.setTipoAcesso(rs.getString("tipo_acesso"));
				if(usuario.getTipoUsuario().equals("1")){
					usuario.setUsuarioFisicoVO(new UsuarioFisicoVO());
					usuario.getUsuarioFisicoVO().setCpf(rs.getString("cpf"));
					usuario.getUsuarioFisicoVO().setNome(rs.getString("nome"));
					usuario.getUsuarioFisicoVO().setSeqUsuario(usuario.getSeqUsuario());
				}else if(usuario.getTipoUsuario().equals("2")){
					usuario.setUsuarioJuridicoVO(new UsuarioJuridicoVO());
					usuario.getUsuarioJuridicoVO().setCnpj(rs.getString("cnpj"));
					usuario.getUsuarioJuridicoVO().setInscricaoEstadual(rs.getString("inscricao_estadual"));
					usuario.getUsuarioJuridicoVO().setRazaoSocial(rs.getString("razao_social"));
					usuario.getUsuarioJuridicoVO().setSeqUsuario(usuario.getSeqUsuario());
				}
				usuario.setEnderecoVO(new EnderecoVO());
				usuario.getEnderecoVO().setBairro(rs.getString("bairro"));
				usuario.getEnderecoVO().setCep(rs.getString("cep"));
				usuario.getEnderecoVO().setCidade(rs.getString("cidade"));
				usuario.getEnderecoVO().setComplemento(rs.getString("complemento"));
				usuario.getEnderecoVO().setEstado(rs.getString("estado"));
				usuario.getEnderecoVO().setLogradouro(rs.getString("logradouro"));
				usuario.getEnderecoVO().setNumero(rs.getString("numero"));
				usuario.getEnderecoVO().setTelCelular(rs.getString("tel_celular"));
				usuario.getEnderecoVO().setTelComercial(rs.getString("tel_comercial"));
				usuario.getEnderecoVO().setTelResidencial(rs.getString("tel_residencial"));
				usuario.getEnderecoVO().setSeqEndereco(usuario.getSeqUsuario());
			}
			stmt.close();
        close();
        return usuario;
    }
}
